// EDDemo.h - This is the main class to the EDDemos.  
//////////////////////////////////////////////////////////////////////////
#ifndef _OGLDEMO_H_
#define _OGLDEMO_H_
#pragma once

#include "camera.h"

#ifdef WIN32
#include <windows.h>
#endif
#include "gl.h"
#include "glu.h"
#include "glut.h"

#include "AnimationSystem.h"

//////////////////////////////////////////////////////////////////////////
// Basic Driver Class for Engine Development Demos
// Its in charge of rendering/updating/shutdown/initialization of the app.
//////////////////////////////////////////////////////////////////////////
class EDDemo
{   
private:
	EDDemo() {}
    ~EDDemo(){}

    Camera					m_Camera;			// The camera
	Animation<matrix4f>		m_Animation;		// The animation
	Interpolator<matrix4f>	m_Interpolator;		// The interpolator
	Model					m_Model;			// The model
public:
     

    //////////////////////////////////////////////////////////////////////////
    // This function gets the instance of the singleton.
    // 
    // Returns
	// EDDemo & the instance of the singleton.
    // Notes:  
    //////////////////////////////////////////////////////////////////////////
    static EDDemo &GetInstance(void)
    {
        static EDDemo instance;
        return instance;
    }

    //////////////////////////////////////////////////////////////////////////
    // This function initalises opengl and the demo app
    //
    // Notes:  
    //////////////////////////////////////////////////////////////////////////
    void Initialize(void);

	//////////////////////////////////////////////////////////////////////////
	// Shuts the Engine Dev Demo down
	//////////////////////////////////////////////////////////////////////////
	void Shutdown(void);

    //////////////////////////////////////////////////////////////////////////
    // This is to be called when a 
    // repaint is needed.
    //
    // Notes:  
    //////////////////////////////////////////////////////////////////////////
    void Display(void);

    //////////////////////////////////////////////////////////////////////////
    // This is to be called when there 
    // is nothin to do.
    //
    // Notes:  
    //////////////////////////////////////////////////////////////////////////
    void Idle(void);
    
	//////////////////////////////////////////////////////////////////////////
    // This is to be called to handle the menus
    // Param:  int value -> The menu item that was selected.
    // 
    // Notes:  
    //////////////////////////////////////////////////////////////////////////
    void Menu(int value);
};

#endif